#ifndef _KRLTHREAD_T_H_
#define _KRLTHREAD_T_H_

#include <hyper_t.h>
#include <krlsem_t.h>
#include <krlobjnode_t.h>

#define THD_SYS_TICK          20  /* 1s中断20次, 调度周期:50ms */

#define THD_SRC_MAX_NBR       8   /* 进程最大能使用的资源数 */
#define THD_SRC_NUL_NBR       -1


/* 进程优先级 */

#define THDPRI_MAX            64
#define THDPRI_MIN            0
#define THDPRI_HIGHEST        THDPRI_MIN   /* 进程最高优先级为 0 */
#define THDPRI_LOWEST         THDPRI_MAX   /* 进程最低优先级为 64 */

/* 进程权限 */

#define THDPRE_SYS            0            /* 系统进程权限 */
#define THDPRE_USR            5            /* 用户进程权限 */

/* 默认值 */

#define DAFT_THDSTKUSR_SZ     0x8000       /* 进程用户栈大小 */
#define DAFT_THDSTKKRL_SZ     0x8000       /* 进程内核栈大小 */

#define DAFT_SPSR             0x10
#define DAFT_CPSR             0xd3
#define DAFT_IDLESPSR         0x13

/* 进程状态 */

enum THREAD_STATUS
    {
    THDSTUS_RUN = 0,    /* 运行态 */
    THDSTUS_SLEEP,      /* 休眠态 */
    THDSTUS_WAIT,       /* 等待态 */   
    THDSTUS_NEW,        /* 创建状态 */
    THDSTUS_ZOMBIE,     /* 僵尸态 */
    };

/* 进程特权 */

enum THREAD_PRIVALEGE
    {
    THDPRILG_USR = 0,  /* 用户级权限 */
    THDPRILG_SYS,      /* 系统级权限 */
    };

/* CPU上下文数据结构 */

typedef struct s_CONTEXT
    {
    reg_t    usrsp;     /* 用户模式下的栈指针地址 */
    reg_t    svcsp;     /* 内核模式下的栈指针地址 */
    reg_t    svcspsr;   /* 内核模式下的备份程序状态寄存器 */
    reg_t    cpsr;      /* 当前程序状态寄存器 */
    reg_t    usrlr;     /* 保存用户模式下的链接寄存器 */
    } context_t;

/* 进程数据结构 */

typedef struct s_THREAD
    {
    spinlock_t  lock;                        /* 进程自旋锁 */
    list_t      list;                        /* 链表 */
    uint_t      flag;                        /* 进程标志 */
    uint_t      status;                      /* 进程状态 */
    uint_t      id;                          /* 进程ID */
    uint_t      cpuid;                       /* 进程所在CPUID */
    uint_t      tick;                        /* 进程调度时间片 */
    uint_t      privalege;                   /* 进程特权 */
    uint_t      priority;                    /* 进程优先级 */
    uint_t      runmode;                     /* 进程运行模式 */
    addr_t      krlstktop;                   /* 进程内核栈的栈顶地址 */
    addr_t      krlstkstart;                 /* 进程内核栈的开始地址 */
    addr_t      usrstktop;                   /* 进程用户栈的栈顶地址 */
    addr_t      usrstkstart;                 /* 进程用户栈的开始地址 */
    void *      memdsc;                      /* 进程内存描述符 */
    context_t   context;                     /* 进程的CPU上下文 */
    objnode_t * srctbl[THD_SRC_MAX_NBR];     /* 进程使用的资源组 */
    } thread_t;

#endif
